package com.song.boot.springstudy.thread.concurrent;

import java.util.concurrent.Phaser;

public class PhaserExample {
    public static void main(String[] args) {
        // 创建一个Phaser，初始注册3个参与者
        Phaser phaser = new Phaser(3);

        // 创建并启动3个线程
        for (int i = 0; i < 3; i++) {
            new Thread(new Task(phaser), "Thread-" + i).start();
        }

        System.out.println("等待各个阶段执行完成后，主线程执行");
    }

    static class Task implements Runnable {
        private final Phaser phaser;

        Task(Phaser phaser) {
            this.phaser = phaser;
        }

        @Override
        public void run() {
            for (int phase = 0; phase < 3; phase++) {
                System.out.println(Thread.currentThread().getName() + " 执行阶段 " + phase);
                // 完成当前阶段，等待其他线程
                phaser.arriveAndAwaitAdvance();
            }
            // 注销自己，不再参与后续阶段
            phaser.arriveAndDeregister();
            System.out.println("等待各个阶段执行完成后，不再参与后续阶段");
        }
    }
}